home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / filesyst / dosfs / dmsdosfs.000 / dmsdosfs / dmsdosfs-0.6.9b / dutil.c < prev    next >
C/C++ Source or Header  |  1996-06-23  |  9KB  |  274 lines

  1. /* 
  2.  
  3. dutil.c
  4.  
  5. DMSDOS filesystem: external utility
  6.  
  7. The DMSDOS filesystem was written by Frank Gockel
  8. (gockel@etecs4.uni-duisburg.de).
  9.  
  10. COPYRIGHT (C) 1995,1996 Frank Gockel
  11.  
  12. Distributed under the GNU General Public License.
  13.  
  14. */
  15.  
  16. #include<stdio.h>
  17. #include<linux/dmsdos_fs.h>
  18. #include<sys/ioctl.h>
  19. #include<sys/types.h>
  20. #include<sys/stat.h>
  21. #include<fcntl.h>
  22. #include<string.h>
  23. #include<errno.h>
  24. #include<unistd.h>
  25.  
  26. int scan(char*arg)
  27. { int w;
  28.  
  29.   if(strncmp(arg,"0x",2)==0)sscanf(arg+2,"%x",&w);
  30.   else sscanf(arg,"%d",&w);
  31.   
  32.   return w;
  33. }
  34.  
  35. void error(int err)
  36. { if(err==-EPERM)printf("Permission denied.\n");
  37.   else if(err==-EIO)printf("I/O Error.\n");
  38.   else if(err==-EINVAL)printf("Invalid parameter.\n");
  39.   else printf("Error %d occured.\n",err);
  40. }
  41.  
  42. void main(int argc, char*argv[])
  43. { Dblsb dblsb;
  44.   int fd;
  45.   int ret;
  46.   unsigned long w[10];
  47.   double ratio;
  48.   struct
  49.   { unsigned long w;
  50.     unsigned char data[512];
  51.   } buffer;
  52.   int i;
  53.   char a[100];
  54.   char b[100];
  55.   char c[100];
  56.   Mdfat_entry mde;
  57.   
  58.   if(argc<2)
  59.   {
  60.     printf("DMSDOS filesystem utility (C) 1995 Frank Gockel\n");
  61.     printf("Usage: %s (directory)\n",argv[0]);
  62.     printf("       %s (directory) cluster (clusterno)\n",argv[0]);
  63.     printf("       %s (directory) sector (sectorno)\n",argv[0]);
  64.     printf("       %s (directory) bitfat (sectorno)\n",argv[0]);
  65.     printf("       %s (directory) setcomp (comp option)\n",argv[0]);
  66.     printf("       %s (directory) setcf (cf option)\n",argv[0]);
  67.     printf("       %s (directory) dumpcache\n",argv[0]);
  68.     printf("       %s (directory) checkfs\n",argv[0]);
  69.     printf("       %s (directory) setmaxcluster (value)\n",argv[0]);
  70.     return;
  71.   }
  72.   
  73.   fd=open(argv[1],O_RDONLY);
  74.   if(fd<0)
  75.   { printf("No such file or directory.\n");
  76.     return;
  77.   }
  78.   
  79.   /* this hack enables reverse version check */
  80.   dblsb.s_dcluster=DMSDOS_VERSION;
  81.   
  82.   ret=ioctl(fd,DMSDOS_GET_DBLSB,&dblsb);
  83.   if(ret<0)
  84.   { printf("This is not a DMSDOS directory.\n");
  85.     close(fd);
  86.     return;
  87.   }
  88.   printf("You are running DMSDOS Version %d.%d.%d.\n\n",(ret&0xff0000)>>16,
  89.          (ret&0x00ff00)>>8,ret&0xff);
  90.   if(ret&0x0f000000)
  91.   { printf("Sorry, this utility is too old for the actual dmsdos version.\n");
  92.     close(fd);
  93.     return;
  94.   }
  95.   if(ret<0x00000608)
  96.   { printf("This utility requires at least DMSDOS Version 0.6.8.\n");
  97.     close(fd);
  98.     return;
  99.   }
  100.   printf("Parameters of the CVF the directory specified belongs to:\n");
  101.   printf("dcluster:    %5d  ",dblsb.s_dcluster);
  102.   printf("mdfatstart:  %5d  ",dblsb.s_mdfatstart);
  103.   printf("fatstart:    %5d  ",dblsb.s_fatstart);
  104.   printf("rootdir:     %5d\n",dblsb.s_rootdir);
  105.   printf("root_entries:%5d  ",dblsb.s_rootdiranzentry);
  106.   printf("sectperclust:%5d  ",dblsb.s_sectperclust);
  107.   printf("bootblock:   %5d  ",dblsb.s_bootblock);
  108.   printf("16bitfat:    %5s\n",dblsb.s_16bitfat?"yes":"no");
  109.   printf("datastart: %7d  ",dblsb.s_datastart);
  110.   printf("dataend:   %7d  ",dblsb.s_dataend);
  111.   printf("comp:   0x%08x  ",dblsb.s_comp);
  112.   printf("cfaktor:   %7d\n",dblsb.s_cfaktor+1);
  113.   printf("max_cluster: %5d  ",dblsb.s_max_cluster);
  114.   printf("max_cluster2:%5d  ",dblsb.s_max_cluster2);
  115.   printf("support_lfn: %5d\n",dblsb.s_support_lfn);
  116.   
  117.   if(argc==3)
  118.   {
  119.   if(strcmp(argv[2],"dumpcache")==0)
  120.   { ioctl(fd,DMSDOS_DUMPCACHE,w);
  121.     printf("Caches dumped to syslog.\n");
  122.     close(fd);
  123.     return;
  124.   }
  125.   if(strcmp(argv[2],"checkfs")==0)
  126.   { printf("Please wait while filesystem is checked...\n");
  127.     ioctl(fd,DMSDOS_SIMPLE_CHECK,w);
  128.     if(w[0]==1||w[0]==2)printf("Check aborted due to lack of kernel memory.\n");
  129.     if(w[0]==0)printf("No filesystem error found.\n");
  130.     if(w[0]==-1)printf("Filesystem has serious errors: FAT level crosslink(s) found.\n");
  131.     if(w[0]==-2)printf("Filesystem has serious errors: MDFAT level crosslink(s) found.\n");
  132.     if(w[0]==-3)printf("Filesystem has minor errors: BITFAT mismatches MDFAT.\n");
  133.     if(w[0]==-1||w[0]==-2)
  134.     { ioctl(fd,DMSDOS_SET_COMP,READ_ONLY);
  135.       printf("The filesystem has been set to read-only mode.\n");
  136.     }
  137.     close(fd);
  138.     return;
  139.   }
  140.   }
  141.   
  142.   if(argc<4)
  143.   {
  144.   
  145.   printf("\nPlease wait while filesystem is scanned...\n\n");
  146.   
  147.   ioctl(fd,DMSDOS_EXTRA_STATFS,w);
  148.   
  149.   printf("free sectors:  %7ld     ",w[0]);
  150.   printf("used sectors:  %7ld     ",w[1]);
  151.   printf("all sectors:   %7ld\n",w[0]+w[1]);
  152.   printf("max free hole: %7ld     ",w[2]);
  153.   i=(100*(w[0]-w[2]))/w[0];
  154.   printf("fragmentation:%7d%%     ",i);
  155.   i=(100*w[1])/(w[0]+w[1]);
  156.   printf("capacity:     %7d%%\n",i);
  157.   printf("free clusters: %7ld     ",w[3]);
  158.   printf("used clusters: %7ld     ",w[4]);
  159.   printf("all clusters:  %7ld\n",w[3]+w[4]+w[5]);
  160.   printf("compressed:    %7ld     ",w[8]);
  161.   printf("uncompressed:  %7ld     ",w[9]);
  162.   printf("lost clusters: %7ld\n",w[5]);
  163.   printf("cluster compression:     %5ld%%           ",(w[8]+w[9]==0)?0:(100*w[8])/(w[8]+w[9])); 
  164.   if(w[6]!=0)ratio=((double)w[7])/((double)w[6]);else ratio=2.0;
  165.   printf("compression ratio:       %5.2f : 1\n",ratio);
  166.   printf("compressed space allocated (real allocated space):  %7ldKB\n",w[6]/2);
  167.   printf("uncompressed space allocated:                       %7ldKB\n",w[7]/2);
  168.   printf("compressed free space (estimated free space):       %7dKB\n",
  169.          ((int)(w[0]*ratio))/2);
  170.   printf("uncompressed free space:                            %7ldKB\n",w[0]/2); 
  171.   printf("maximum free space due to cluster limit:            %7ldKB\n",
  172.          w[3]*dblsb.s_sectperclust/2);
  173.   
  174.   if(w[2]<=dblsb.s_sectperclust*3&&w[0]>dblsb.s_sectperclust*3)
  175.     printf("Warning: This CVF should immediately be defragmented at internal MDFAT level.\n"
  176.            "         Do not write to this CVF unless you have defragmented it.\n");
  177.   else
  178.   if(w[0]<=dblsb.s_sectperclust*3)
  179.     printf("Warning: This CVF is full. Do not write to it.\n");
  180.   else 
  181.   if(dblsb.s_full)
  182.     printf("Warning: This CVF is full or too fragmented at internal MDFAT\n"
  183.            "         level, non-root write access is refused.\n");
  184.   else
  185.   if(w[3]*dblsb.s_sectperclust<w[0])
  186.    {
  187.       printf("Warning: You cannot use all free space of this CVF due to the cluster limit.\n");
  188.     i=((int)(w[0]*ratio))/dblsb.s_sectperclust-w[3]+dblsb.s_max_cluster;
  189.     if(i>dblsb.s_max_cluster2)i=dblsb.s_max_cluster2;
  190.     if(i>dblsb.s_max_cluster)
  191.       printf("         Enlarge the max_cluster value or the dos compression ratio.\n"
  192.              "         I recommend the following max_cluster value for this CVF: %d\n",i);
  193.    }
  194.   }
  195.   
  196.   else if(strcmp(argv[2],"bitfat")==0)
  197.   { w[0]=scan(argv[3]);
  198.     ret=ioctl(fd,DMSDOS_READ_BITFAT,w);
  199.     if(ret<0)error(ret);
  200.     else 
  201.     { if(w[1]==0)printf("\nbitfat: sector is free\n");
  202.       if(((signed long)w[1])>0)printf("\nbitfat: sector is allocated\n");
  203.       if(((signed long)w[1])<0)printf("\nbitfat: value out of range\n");
  204.     }
  205.   }
  206.   
  207.   else if(strcmp(argv[2],"cluster")==0)
  208.   { w[0]=scan(argv[3]);
  209.     w[1]=&mde;
  210.     ret=ioctl(fd,DMSDOS_READ_MDFAT,w);
  211.     if(ret<0)error(ret);
  212.     else 
  213.     { 
  214.       printf("used:              %s\n",(mde.flags&2)?"yes":"no");
  215.       if(w[1]&0x80000000)
  216.       printf("compressed:        %s\n",(mde.flags&1)?"no":"yes");
  217.       printf("size uncompressed: %d  compressed: %d\n",
  218.              mde.size_hi_minus_1+1,mde.size_lo_minus_1+1);
  219.       printf("first sector:      %ld\n",mde.sector_minus_1+1);
  220.       printf("unknown bits:      %d\n",mde.unknown);
  221.       ret=ioctl(fd,DMSDOS_READ_DFAT,w);
  222.       if(ret<0)error(ret);
  223.       else printf("next cluster:      %ld\n",w[1]);
  224.     }
  225.   }
  226.   
  227.   else if(strcmp(argv[2],"sector")==0)
  228.   { buffer.w=scan(argv[3]);
  229.     ret=ioctl(fd,DMSDOS_READ_BLOCK,&buffer);
  230.     if(ret<0)error(ret);
  231.     else
  232.     {
  233.       for(i=0;i<512;++i)
  234.       { if(i%16==0){sprintf(a,"%3X : ",i);strcpy(b,"");}
  235.         sprintf(c," %02X",buffer.data[i]);
  236.         strcat(a,c);
  237.         if(buffer.data[i]>=32&&buffer.data[i]<128)
  238.            sprintf(c,"%c",buffer.data[i]);
  239.         else strcpy(c,".");
  240.         strcat(b,c);
  241.         
  242.         if(i%16==15)printf("%s  %s\n",a,b);
  243.         
  244.       }
  245.     }
  246.   }
  247.   
  248.   else if(strcmp(argv[2],"setcomp")==0)
  249.   { if(strcmp(argv[3],"ro")==0)ioctl(fd,DMSDOS_SET_COMP,READ_ONLY);
  250.     else if(strcmp(argv[3],"no")==0)ioctl(fd,DMSDOS_SET_COMP,UNCOMPRESSED);
  251.     else if(strcmp(argv[3],"guess")==0)ioctl(fd,DMSDOS_SET_COMP,GUESS);
  252.     else if(strcmp(argv[3],"ds00")==0)ioctl(fd,DMSDOS_SET_COMP,DS_0_0);
  253.     else if(strcmp(argv[3],"ds01")==0)ioctl(fd,DMSDOS_SET_COMP,DS_0_1);
  254.     else if(strcmp(argv[3],"ds02")==0)ioctl(fd,DMSDOS_SET_COMP,DS_0_2);
  255.     else if(strcmp(argv[3],"jm00")==0)ioctl(fd,DMSDOS_SET_COMP,JM_0_0);
  256.     else if(strcmp(argv[3],"jm01")==0)ioctl(fd,DMSDOS_SET_COMP,JM_0_1);
  257.     else if(strcmp(argv[3],"sq00")==0)ioctl(fd,DMSDOS_SET_COMP,SQ_0_0);
  258.     else printf("??? mode %s not recognized.\n",argv[3]);
  259.   }
  260.   
  261.   else if(strcmp(argv[2],"setcf")==0)
  262.   { ioctl(fd,DMSDOS_SET_CF,scan(argv[3])-1);
  263.   }
  264.   
  265.   else if(strcmp(argv[2],"setmaxcluster")==0)
  266.   { ioctl(fd,DMSDOS_SET_MAXCLUSTER,scan(argv[3]));
  267.   }
  268.   
  269.   else printf("??? syntax error in command line.\n");
  270.   
  271.   close(fd);
  272.   
  273. }
  274.